/*
题目: 任务调度器Ⅱ
给你一个下标从 0 开始的正整数数组 tasks ，表示需要 按顺序 完成的任务，其中 tasks[i] 表示第 i 件任务的 类型 。

同时给你一个正整数 space ，表示一个任务完成 后 ，另一个 相同 类型任务完成前需要间隔的 最少 天数。

在所有任务完成前的每一天，你都必须进行以下两种操作中的一种：

    完成 tasks 中的下一个任务
    休息一天

请你返回完成所有任务所需的 最少 天数。
https://leetcode.cn/problems/task-scheduler-ii/
 */
public class TaskSchedulerII {
    public long taskSchedulerII(int[] tasks, int space) {
        Map<Integer, Long> map = new HashMap<> (); // Key: 任务类型, Value: 这个任务类型最早在 value 下标才能完成
        long needDay = 1; //记录实际天数
        int n = tasks.length;

        for (int i = 0; i < n; i++, needDay ++) {
            if (map.getOrDefault(tasks[i], 0L) > needDay) { //还不能做这个任务
                needDay = map.get(tasks[i]); //休息
                map.put(tasks[i], map.get(tasks[i]) + space + 1);
                continue;
            }
            map.put(tasks[i], needDay + space + 1);
        }

        return needDay - 1;
    }
}
